/**
 * 给两个数组，可以交换对应位置的数，问两个数组各自的积之和最大是多少
 * 对于任意一对数而言，交换之前的积和是 aA + bB
 * 交换之后是 aB + bA
 * 所以值得交换的条件是 (a - b)(B - A) > 0
 * 也就是说要尽可能的把大数放在一起
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

llt const MOD = 1000000000 + 7LL;

int N;
vector<pair<llt, int>> A;

llt proc(){
    sort(A.begin(), A.end());
    llt a = 1, b = 1;
    vi flag(N + N, 0);
    for(const auto & p : A){
        if(flag[p.second]){
            b = b * p.first % MOD;
        }else{
            a = a * p.first % MOD;
            flag[p.second] = 1;
            if(p.second >= N) assert(flag[p.second-N] == 0), flag[p.second - N] = 1;
            else assert(flag[p.second+N] == 0), flag[p.second + N] = 1;
        }
    }
    return (a + b) % MOD;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N;
        A.assign(N + N, {});
        for(int i=0;i<N+N;++i){
            cin >> A[i].first;
            A[i].second = i;
        }
        cout << proc() << "\n";
    }
    return 0;
} 